package Java182_189;

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;

/*
拓展小知识：
如何将一个字符串“100”转换成为整数100？
integer.pareseint(String str):   参数是字符串，返回值类型是 int数字，可以将字符串转换成int数字
但是前提是这个参数字符串必须只包含数字，格式必须是int数字！
 */
public class case182_189 {

    public static void main(String[] args) throws IOException {
//        1、创建一个集合，用来储存5个英雄
        ArrayList<Hero> list = new ArrayList<>();

//        2、读取文件把数据加载到集合
//        System.out.println(" 加载文件的数据到集合当中。");
        loadFileToList(list);
//        3、判断一下集合当中有没有内容，是不是新的？
        boolean isNew = list.size() == 0;
        System.out.println("这个是不是新的队伍：" + isNew);
//        如果集合的长度为0，说明这个队伍是新的

//        如果是新的队伍，没有人，就要创建5个对象添加到集合当中
        if (isNew) {
//            调用方法，向集合中添加五个英雄
            addFiveHeros(list);
        }
//        如果队伍不是新的，已经有人了，就不需要创建了

        System.out.println("我们队伍的阵容是：");
//        遍历集合，输出其中的每一个对象的具体信息
//        System.out.println("循环5次进行遍历");

        showHeros(list);

//        统计一下总和的战斗力是多少。
        int totalAttack = getTotalAttack(list);
        System.out.println("我们队伍的战斗力总和是：" + totalAttack);

//        判断一下集合是不是新的
        if (isNew) {
            saveToFile(list);//调用方法将集合的信息写到文件中。
        }

//        如果集合不是新的，而是从文件中加载得到的数据就什么就不用做
        System.out.println("退出游戏！");
    }

    /*
     * 定义一个方法：用来读取文件，将数据添加到集合当中
     * 返回值类型：参数集合是引用类型，形式参数会印象实际参数   void
     * 参数名称：loadFileToList
     * 参数列表：ArrayList<Hero>
     * */
    public static void loadFileToList(ArrayList<Hero> list) throws IOException {
        BufferedReader br = new BufferedReader(new FileReader("friends.txt"));
        String line;//读取一行字符串
        while ((line = br.readLine()) != null) {
//            将字符串转化为一个Hero对象
//            将一个完整的字符串切分成肉感小段
            String[] array = line.split(",");
            String name = array[0];//姓名
//            将字符串转换成为对应的int基本数字类型
            int attack = Integer.parseInt(array[1]);//攻击力
            String type = array[2];//类型
//            根据三条信息创建一个英雄对象
            Hero hero = new Hero(name, attack, type);
            boolean add = list.add(hero);
        }
        br.close();
    }


    /*
     * 定义一个方法：用来将集合当中的对象数据全部写道文件当中，
     * 返回值类型   void
     * 参数名称   saveToFile
     * 参数列表  ArrayList<Hero>
     *
     */

    public static void saveToFile(ArrayList<Hero> list) throws IOException {
        BufferedWriter bw = new BufferedWriter(new FileWriter("friends.txt"));
//        遍历集合
        for (int i = 0; i < list.size(); i++) {
            Hero hero = list.get(i);//当前英雄

//            需要将Hero对象转化为字符串，将三个成员变量拼接成一个字符串
            String str = hero.getName() + "," + hero.getType() + "," + hero.getAttack();

//            将对对应的字符串写到文件中
            bw.write(str);
            bw.newLine();//换行
        }
        bw.close();
    }

    /*
     * 定义一个方法，用来根据集合求出战斗力的总和。
     * 返回值类型   int 代表结果总值
     * 参数名称   getTotalAttack
     * 参数列表  ArrayList<Hero>
     */


    public static int getTotalAttack(ArrayList<Hero> list) {
        int total = 0;//代表总攻击力
        for (int i = 0; i < list.size(); i++) {
            Hero hero = list.get(i);
            total += hero.getAttack();
        }
        return total;
    }

    /* 定义一个方法，用来遍历集合当中所有的对象
     * 返回值类型   打印输出     void
     * 方法名称：showHeros
     * 参数列表ArrayList<Hero>
     */

    public static void showHeros(ArrayList<Hero> list) {
        for (int i = 0; i < list.size(); i++) {
            Hero hero = list.get(i);//当前英雄
            System.out.println("英雄的名字：" + hero.getName() + ",攻击力："
                    + hero.getAttack() + ",英雄的类型：" + hero.getType());
        }
    }

    /*
     * 定义一个方法，用来向集合中添加五位英雄，三要素
     * 返回值类型：参数集合是引用类型，形式参数的操作回影响实际参数，所以不需要返回值：void
     * 方法名称：addFiveHeros
     *参数列表：ArrayList<Hhero>
     *
     */


    public static void addFiveHeros(ArrayList<Hero> list) {
//            信息用来键盘输入
        Scanner sc = new Scanner(System.in);
        for (int i = 1; i <= 5; i++) {
//              循环5次
            System.out.println("请输入第" + i + "位英雄的名字：");
            String name = sc.next();
            System.out.println("请输入第" + i + "位英雄的攻击力：");
            int attack = sc.nextInt();
            System.out.println("请输入第" + i + "位英雄的类型：");
            String type = sc.next();
//            创建英雄对象
            Hero hero = new Hero(name, attack, type);
//            要把英雄对象添加到集合中
            list.add(hero);
        }
    }
}


//    定义一个类，代表英雄
class Hero {
    //        成员变量
    private String name;
    private int attack;
    private String type;

    public Hero() {

    }

    public Hero(String name, int attack, String type) {
        this.name = name;
        this.attack = attack;
        this.type = type;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAttack() {
        return attack;
    }

    public void setAttack(int attack) {
        this.attack = attack;
    }

    public String getType() {
        return type;
    }

    public void setType(String type) {
        this.type = type;
    }
}
